package ar.fiuba.tp7552.buildadmin.webactions.planes;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;


import ar.fiuba.tp7552.buildadmin.model.BusinessException;
import ar.fiuba.tp7552.buildadmin.model.builds.Edificio;
import ar.fiuba.tp7552.buildadmin.model.builds.Propiedad;
import ar.fiuba.tp7552.buildadmin.model.builds.Responsable;
import ar.fiuba.tp7552.buildadmin.model.expensas.TipoExpensa;
import ar.fiuba.tp7552.buildadmin.model.planes.Plan;
import ar.fiuba.tp7552.buildadmin.service.EdificioService;
import ar.fiuba.tp7552.buildadmin.service.PlanService;
import ar.fiuba.tp7552.buildadmin.service.PropiedadService;
import ar.fiuba.tp7552.buildadmin.service.ResponsableService;
import ar.fiuba.tp7552.buildadmin.webactions.BaseAction;

import com.opensymphony.xwork2.Preparable;

public class PlanesAction extends BaseAction implements Preparable {
	
	private PlanService planService;
	private EdificioService edificioService;
	private ResponsableService resposableService;
	private Edificio edificio;
	private Responsable responsable;
	private PropiedadService propiedadService;
	private Collection<Propiedad> propiedades;
	
	private BigDecimal monto;
	private Integer cuotas;
	private Date fecha;
	TipoExpensa tipoExpensa;
	
	private Plan plan;
	

	// ~~ Constructor ====================================================
	public PlanesAction(PlanService planService, EdificioService edificioService, 
			ResponsableService resposableService, PropiedadService propiedadService) {
		super();
		this.planService = planService;
		this.edificioService = edificioService;
		this.resposableService=resposableService;
		this.propiedadService = propiedadService;
		
	}

	// ~~ Actions ========================================================
	@Override
	public void prepare() {
		// FIXME
		if (edificio!=null && edificio.getId() != null ) {
			edificio = edificioService.get(edificio.getId());
		}else{
			plan = new Plan();
		}
	}
	
	
	public String search()  {
		propiedades = propiedadService.findPropiedades(edificio, responsable);
		if (propiedades.size() > 0) {
			return BaseAction.SUCCESS;
		} else {
			this.addActionError("No se encontraron propiedades para los criterios indicados");
			return BaseAction.INPUT;
		}
	}
	
	
	
	public String load() {
		return BaseAction.SUCCESS;
	}
	
	
	
	public String delete() {
		planService.delete(plan); 
		return BaseAction.SUCCESS;
	}
	
	public String createPlan() {
		try {
		// FIXME cambiar por los valores que vienen del submit del formulario.
		plan = planService.createPlan(responsable, propiedades, fecha, monto, tipoExpensa, cuotas);

		} catch (BusinessException e) {
		this.addActionError(e.getMessage());
		return BaseAction.INPUT;
		}

		return BaseAction.SUCCESS;
		}
	
	public String save() throws BusinessException {
		if (plan.isNew()) {
			planService.createPlan(responsable, propiedades, fecha, monto, tipoExpensa,cuotas);
			plan.setId(plan.getId());
		} else {
			planService.update(plan);
		}
		return BaseAction.SUCCESS;
	}


	public Edificio getEdificio() {
		return edificio;
	}


	public void setEdificio(Edificio edificio) {
		this.edificio = edificio;
	}


	public Responsable getResponsable() {
		return responsable;
	}


	public void setResponsable(Responsable responsable) {
		this.responsable = responsable;
	}
	
	public Collection<Edificio> getEdificios()  {
		return edificioService.getAll();
	}
	
	public Collection<Responsable> getResponsables()  {
		return resposableService.getAll();
	}


	public Collection<Propiedad> getPropiedades() {
		return propiedades;
	}


	public void setPropiedades(Collection<Propiedad> propiedades) {
		this.propiedades = propiedades;
	}
	
	

}